#include <stdio.h>
#include <string>
#include <iostream>
#include <vector>
#include <list>
#include <algorithm>//注意这个单词尽量记住
using namespace std;


//定义模板函数来进行打印容器中的内容(使用迭代器)
template<class container>
void PrintContainers(const container &con)
{
  class container::const_iterator it=con.begin();
  //因为参数为const 所以这里的迭代器也要用const_iterator
  while(it!=con.end())
  {
    cout<<*it<<" ";
    it++;
  }
  cout<<endl;
}

//用模板函数反向打印顺序表（使用反向迭代器）
template<class  container>
void   ReversePrintContainers( const container & con )
{
  class container::const_reverse_iterator it=con.rbegin();
  while(it!=con.rend())
  {
    cout<<*it<<" ";
    it++;
  }
  cout<<endl;
}

//自定义策略，比较函数， great()降序排序
struct My_great
{
  bool operator()(int i,int j)
  {
    return i>j;
  }
};
void vector_test()
{
  vector<int> v1;
  v1.push_back(2);
  v1.push_back(5);
  v1.push_back(3);
  v1.push_back(1);
  v1.push_back(4);

  //用模板函数来实现打印顺序表
  PrintContainers(v1);

  //用模板函数反向打印顺序表
  ReversePrintContainers(v1);

  //对顺序表来进行排序(1)这里的v1.begin()和v1.end()为两个迭代器。分别为要排序的开始位置和要排序的结束位置
  sort(v1.begin(),v1.end());
  PrintContainers(v1);

  ////对顺序表进行排序(2)(自定义策略)
  //sort(v1.begin(),v1.end(),My_great());
  //PrintContainers(v1);

  //对顺序表进行排序(3)(自定义策略，用仿函数)
  sort(v1.begin(),v1.end(),greater<int>());
  PrintContainers(v1);

  //对顺序表中某一元素之前进行插入
  //顺序表中的insert给的是某个位置，若想在某个元素之前进行插入，必须找到该元素的位置
  //这里查找该元素的位置用到算法中的find()
  //find()函数原型：InputIterator find (InputIterator first, InputIterator last, const T& val);
  vector<int>::iterator find_ret=find(v1.begin(),v1.end(),3);
  printf("在3之前插入88\n");
  v1.insert(find_ret,88);
  PrintContainers(v1);
  //对于vector一般不用insert()接口
  

  //如何将顺序表销毁
  //我们直到clear()函数只是将顺序表中的数据清空
  
  {
    vector<int> tmp;
    tmp.swap(v1);
  }
  //这里采用限制tmp对象的生命周期
  //将v1与tmp进行交换
  //则v1为空，且tmp出作用域就会释放
  printf("将v1释放后\n");
  PrintContainers(v1);

}


void list_test()
{
  list<string> L;
  L.push_back("aaaa");
  L.push_back("bbbb");
  L.push_back("cccc");
  L.push_back("dddd");
  L.push_back("eeee");
  L.push_back("ffff");
  //利用模板函数打印list中的内容
  PrintContainers(L);

  //用模板函数反向打印链表
  ReversePrintContainers(L);

  //对链表来进行排序(1)这里的L.begin()和L.end()为两个迭代器。分别为要排序的开始位置和要排序的结束位置
  //sort(L.begin(),L.end(),less<string>());
  PrintContainers(L);
  //TODO
  //这里存在问题
  //对链表进行排序（2）（自定义策略，用仿函数）
  //
  //
  
  //对链表中某一元素之前进行插入
  //链表表中的insert给的是某个位置，若想在某个元素之前进行插入，必须找到该元素的位置
  //这里查找该元素的位置用到算法中的find()
  //find()函数原型：InputIterator find (InputIterator first, InputIterator last, const T& val);
  list<string>::iterator find_ret=find(L.begin(),L.end(),"bbbb");
  printf("在3之前插入hello\n");
  L.insert(find_ret,"hello");
  PrintContainers(L);
}



int main()
{
  vector_test();
  list_test();
  return 0;
}
